package com.zjsru.plan2024.oneday;

/**
 * 3208. 交替组 II
 *
 * @Author: cookLee
 * @Date: 2024-11-27
 */
public class NumberOfAlternatingGroups2 {

    /**
     * 主
     * \
     * 环中连续 k 块瓷砖的颜色如果是 交替 颜色（也就是说除了第一块和最后一块瓷砖以外，中间瓷砖的颜色与它 左边 和 右边 的颜色都不同），那么它被称为一个 交替 组。
     * \
     * 输入：colors = [0,1,0,1,0], k = 3
     * 输出：3
     * \
     * 输入：colors = [0,1,0,0,1,0,1], k = 6
     * 输出：2
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        NumberOfAlternatingGroups2 numberOfAlternatingGroups2 = new NumberOfAlternatingGroups2();
        int[] colors = new int[]{0, 1, 0, 1, 0};
        int k = 3;
        System.out.println(numberOfAlternatingGroups2.numberOfAlternatingGroups(colors, k));
    }

    /**
     * 交替组数:模拟
     *
     * @param colors 颜色
     * @param k      k
     * @return int
     */
    public int numberOfAlternatingGroups(int[] colors, int k) {
        int len = colors.length;
        //计算连续数
        int count = 1;
        int ans = 0;
        //为了得到初始的 count 值,需要判断当前位置k-1个数 -> 0 - (k - 1) = -k + 1 -> 因为需要判断前一步多增加一步 -> 0 - (k - 1 -1 ) = -k + 2
        for (int i = -k + 2; i < len; i++) {
            //判断是否数组是否连续
            if (colors[(i + len) % len] != colors[(i - 1 + len) % len]) {
                count++;
            } else {
                count = 1;
            }
            if (count >= k) {
                ans++;
            }
        }
        return ans;
    }

    /**
     * 复制数组首尾相连
     *
     * @param colors 颜色
     * @param k      k
     * @return int
     */
    public int numberOfAlternatingGroups2(int[] colors, int k) {
        int len = colors.length;
        int[] extendedColors = new int[2 * len];
        // 复制数组
        System.arraycopy(colors, 0, extendedColors, 0, len);
        System.arraycopy(colors, 0, extendedColors, len, len);
        // 计算连续数
        int count = 1;
        int ans = 0;

        // 遍历新数组
        for (int i = 1; i < len + k - 1; i++) {
            // 判断是否数组是否连续
            if (extendedColors[i] != extendedColors[i - 1]) {
                count++;
            } else {
                count = 1;
            }
            if (count >= k) {
                ans++;
            }
        }

        return ans;
    }

}
